package com.liming.stock.client;

import com.liming.common.enums.DateScopeEnum;
import com.liming.common.pojo.dto.stock.*;
import com.liming.common.pojo.vo.PageVO;
import com.liming.common.pojo.vo.stock.ProductSalesCountVO;
import com.liming.common.pojo.vo.stock.StockDashboardVO;
import com.liming.common.pojo.vo.stock.StockFlowVO;
import com.liming.common.pojo.vo.stock.StockVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 库存 OpenFeign客户端
 *
 * @author liming
 * @date 2025/1/21
 */
@FeignClient(value = "stock-service", path = "/service/stock")
public interface StockClient {

    /**
     * 获取可用库存数量
     *
     * @param id 库存ID
     * @return 可用库存数量
     */
    @GetMapping("availableQuantity/{id}")
    Integer getAvailableQuantity(@PathVariable Long id);

    /**
     * 库存分页
     *
     * @return 库存分页
     */
    @GetMapping
    PageVO<StockVO> page(@SpringQueryMap StockPageQuery query);

    /**
     * 库存流水分页
     *
     * @return 库存流水分页
     */
    @GetMapping("flow")
    PageVO<StockFlowVO> pageFlow(@SpringQueryMap StockFlowPageQuery query);

    /**
     * 库存大屏
     *
     * @param scope 范围
     * @return 库存大屏
     */
    @GetMapping("store-dashboard")
    StockDashboardVO stockDashboard(@RequestParam String scope);

    /**
     * 初始化库存
     *
     * @param initStockDTO 初始化库存信息
     * @return 是否初始化成功
     */
    @PostMapping
    Boolean initStock(InitStockDTO initStockDTO);

    /**
     * 添加库存流水
     *
     * @param addStockFlowDTO 添加库存流水信息
     * @return 是否添加成功
     */
    @PostMapping("flow")
    Boolean addStockFlow(AddStockFlowDTO addStockFlowDTO);

    /**
     * 更新库存数量
     *
     * @param updStockQuantityDTO 更新库存数量信息
     * @return 是否更新成功
     */
    @PutMapping("updStockQuantity")
    Boolean updStockQuantity(@RequestBody UpdStockQuantityDTO updStockQuantityDTO);

    /**
     * 更新库存状态
     *
     * @param id 库存ID
     * @return 是否更新成功
     */
    @PutMapping("updStatus/{id}")
    Boolean updStatus(@PathVariable Long id);

    /**
     * 出库
     *
     * @param id       库存ID
     * @param quantity 出库数量
     * @return 是否出库成功
     */
    @PutMapping("out/{id}")
    Boolean out(@PathVariable Long id, @RequestParam Integer quantity);

    /**
     * 商品出库数量 - 时间
     *
     * @param dateScopeEnum 时间范围枚举
     * @return 列表（商品出库数量 - 时间）
     */
    @PostMapping("salesCountByTime")
    List<ProductSalesCountVO> salesCountByTime(@RequestBody DateScopeEnum dateScopeEnum);

    /**
     * 库存预警数量
     *
     * @return 库存预警数量
     */
    @GetMapping("alertStockCount")
    Long alertStockCount();

    /**
     * 获取所有的库存 商品ID - 库存数量 Map
     *
     * @return Map<商品ID, 库存数量>
     */
    @GetMapping("allProductAvailableQuantityMap")
    Map<Long, Integer> allProductAvailableQuantityMap();

    /**
     * 热销商品IDS
     *
     * @return 热销商品IDS
     */
    @GetMapping("hotSalesProductIds")
    List<Long> hotSalesProductIds();

    /**
     * 订单退款成功 - 库存恢复 新增退款流水
     *
     * @param orderId 订单ID
     */
    @PostMapping("refundSuccess/{orderId}")
    void refundSuccess(@PathVariable Long orderId);

    /**
     * 锁定库存 根据 商品ID和数量 Map
     *
     * @param productIdAndQuantityMap 商品ID和数量 Map
     * @return 是否锁定成功
     */
    @PutMapping("lockStockByProductIdAndQuantity/{orderId}")
    Boolean lockStockByProductIdAndQuantity(@PathVariable Long orderId, @RequestBody Map<Long, Integer> productIdAndQuantityMap);

    /**
     * 订单支付成功
     *
     * @param orderId 订单ID
     * @return 内部是否操作成功
     */
    @PutMapping("paymentSuccess/{orderId}")
    Boolean paymentSuccess(@PathVariable Long orderId);

    /**
     * 订单支付失败
     *
     * @param orderId 订单ID
     * @return 内部是否操作成功
     */
    @PutMapping("paymentFailure/{orderId}")
    Boolean paymentFailure(@PathVariable Long orderId);
}
